package utils

import "fmt"
import "crypto/md5"
import "math/rand"
import "strconv"
import "strings"
import "time"

//将字符串加密成 md5
func String2Md5(str string) string {
	data := []byte(str)
	has := md5.Sum(data)
	return fmt.Sprintf("%x", has)
}

/**
+----------------------------------------------------------
* 产生随机字串，可用来自动生成密码
+----------------------------------------------------------
* @param string length 长度
* @param int str_type 字串类型
* 0 字母 1 数字 其它 混合
* @param string add_char 额外字符
+----------------------------------------------------------
* @return string
+----------------------------------------------------------
*/
func RandomString(length int, str_type int, add_char string) string {
	// 48 ~ 57 数字
	// 65 ~ 90 A ~ Z
	// 97 ~ 122 a ~ z
	// 一共62个字符，在0~61进行随机，小于10时，在数字范围随机，
	// 小于36在大写范围内随机，其他在小写范围随机
	rand.Seed(time.Now().UnixNano())
	result := make([]string, 0, length)

	switch str_type {
	//在大小写字母中随机
	case 0:
		for i := 0; i < length; i++ {
			t := rand.Intn(52)
			if t < 26 {
				result = append(result, string(rand.Intn(26)+65))
			} else {
				result = append(result, string(rand.Intn(26)+97))
			}
		}
	//在数字中随机
	case 1:
		for i := 0; i < length; i++ {
			result = append(result, strconv.Itoa(rand.Intn(10)))
		}
	//在大写字母中随机
	case 2:
		for i := 0; i < length; i++ {
			result = append(result, string(rand.Intn(26)+65))
		}
	//在小写字母中随机
	case 3:
		for i := 0; i < length; i++ {
			result = append(result, string(rand.Intn(26)+97))
		}
	//在中文中随机
	case 4:
		name := "腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂"
		words := []rune(name)
		wordsLen := len(words)
		for i := 0; i < length; i++ {
			t := rand.Intn(wordsLen)
			result = append(result, string(words[t:t+1]))
		}
	//混合
	case 5:
		for i := 0; i < length; i++ {
			t := rand.Intn(62)
			if t < 10 {
				result = append(result, strconv.Itoa(rand.Intn(10)))
			} else if t < 36 {
				result = append(result, string(rand.Intn(26)+65))
			} else {
				result = append(result, string(rand.Intn(26)+97))
			}
		}
	default:
		for i := 0; i < length; i++ {
			t := rand.Intn(62)
			if t < 10 {
				result = append(result, strconv.Itoa(rand.Intn(10)))
			} else if t < 36 {
				result = append(result, string(rand.Intn(26)+65))
			} else {
				result = append(result, string(rand.Intn(26)+97))
			}
		}
	}
	return strings.Join(result, "")
}

/**
+----------------------------------------------------------
* 获取一定范围内的随机数字 位数不足补零
+----------------------------------------------------------
* @param integer $min 最小值
* @param integer $max 最大值
+----------------------------------------------------------
* @return string
+----------------------------------------------------------
*/

/**
+----------------------------------------------------------
* 生成一定数量的随机数，并且不重复
+----------------------------------------------------------
* @param integer $number 数量
* @param string $len 长度
* @param string $type 字串类型
* 0 字母 1 数字 其它 混合
+----------------------------------------------------------
* @return string
+----------------------------------------------------------
*/
